/*
 * Copyright 2002-2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.ideacome.test.common.mock.config.annotation;

import com.ideacome.test.common.mock.config.MockConfigUtils;
import com.ideacome.test.common.mock.interceptor.MockInterceptor;
import com.ideacome.test.common.mock.interceptor.MockKeyGenerator;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.cache.interceptor.BeanFactoryCacheOperationSourceAdvisor;
import org.springframework.cache.interceptor.CacheOperationSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Role;

/**
 * 代理实现mock的配置
 *
 * @author 罗成
 */
@Configuration
public class ProxyMockingConfiguration extends AbstractMockingConfiguration {

    @Bean(name = MockConfigUtils.MOCK_OPERATION_SOURCE_ADVISOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public BeanFactoryCacheOperationSourceAdvisor mockOperationSourceAdvisor() {
        BeanFactoryCacheOperationSourceAdvisor advisor =
                new BeanFactoryCacheOperationSourceAdvisor();
        advisor.setCacheOperationSource(mockOperationSource());
        advisor.setAdvice(mockInterceptor());
        advisor.setOrder(this.enableMocking.<Integer>getNumber("order"));
        return advisor;
    }


    @Bean(name = MockConfigUtils.MOCK_OPERATION_SOURCE_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public CacheOperationSource mockOperationSource() {
        return new AnnotationMockOperationSource();
    }

    @Bean(name = MockConfigUtils.MOCK_INTERCEPTOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public MockInterceptor mockInterceptor() {
        MockInterceptor interceptor = new MockInterceptor();
        interceptor.setCacheOperationSources(mockOperationSource());
        interceptor.setNeedMock(this.needMock);
        MockKeyGenerator mockKeyGenerator = new MockKeyGenerator();
        mockKeyGenerator.setKeyPrefix(this.keyPrefix);
        interceptor.setKeyGenerator(mockKeyGenerator);
        if (this.cacheResolver != null) {
            interceptor.setCacheResolver(this.cacheResolver);
        } else if (this.cacheManager != null) {
            interceptor.setCacheManager(this.cacheManager);
        }
        if (this.keyGenerator != null) {
            interceptor.setKeyGenerator(this.keyGenerator);
        }
        if (this.errorHandler != null) {
            interceptor.setErrorHandler(this.errorHandler);
        }
        return interceptor;
    }

}
